#!/usr/bin/env python
# -*- coding: UTF-8 -*-
"""
@Project ：python_learning 
@File ：命令模式.py
@IDE  ：PyCharm 
@Author ：李涵彬
@Date ：2024/3/1 23:22 
"""

"""
命令模式 (Command Pattern)
命令模式是一种行为型设计模式，它允许将请求封装成对象，这样可以将客户端参数化，队列化，或者记录日志，以及支持可撤销的操作。

在 Python 中，命令模式通常通过一个命令接口和具体的命令类来实现。以下是一个简单的示例：

在这个示例中，Command 是命令接口，定义了命令对象的执行方法。ConcreteCommandA 和 ConcreteCommandB 是具体命令类，分别实现了不同的命令操作。Receiver 是命令的接收者，负责执行具体的操作。Invoker 是调用者，负责调用命令对象的执行方法。

客户端代码创建具体命令对象和接收者对象，并将它们传递给调用者。调用者可以在运行时决定调用哪个命令对象。

命令模式适用于需要将请求封装成对象，或者需要支持可撤销操作的情况。通过使用命令模式，可以实现更灵活的命令执行、队列化命令、记录日志以及实现撤销和重做等功能。另一个常见的设计模式是访问者模式。
"""

from abc import ABC, abstractmethod


# 命令接口
class Command(ABC):
	@abstractmethod
	def execute(self):
		pass


# 具体命令A
class ConcreteCommandA(Command):
	def __init__(self, receiver):
		self._receiver = receiver

	def execute(self):
		self._receiver.action_a()


# 具体命令B
class ConcreteCommandB(Command):
	def __init__(self, receiver):
		self._receiver = receiver

	def execute(self):
		self._receiver.action_b()


# 接收者
class Receiver:
	def action_a(self):
		print("执行具体命令A的操作")

	def action_b(self):
		print("执行具体命令B的操作")


# 调用者
class Invoker:
	def __init__(self):
		self._command = None

	def set_command(self, command):
		self._command = command

	def execute_command(self):
		self._command.execute()


# 客户端代码
if __name__ == "__main__":
	receiver = Receiver()
	command_a = ConcreteCommandA(receiver)
	command_b = ConcreteCommandB(receiver)

	invoker = Invoker()

	invoker.set_command(command_a)
	invoker.execute_command()

	invoker.set_command(command_b)
	invoker.execute_command()
